/**
 ******************************************************************************
 * @file tcState_queue.h
 * @author GX (2524913364@qq.com)
 * @brief   链式队列,用户使用的时候直接将所有的前缀 "tcState_" 换成想要的就行了
 *          Function List:
                seqQueue *createQueue(void)         创建一个队列
                bool destroyQueue(seqQueue *que)    销毁队列
                bool inQueue(seqQueue *que, const void *item)   入队
                bool outQueue(seqQueue *que, void *item)    出队
                bool tcState_ergodicQueue(tcState_Queue_t *que)  遍历队列，该函数部分代码，
                                                            要用户自己实现
 * @version 1.0.1 
 * @date 2022-08-12
 * 
 * 
 ******************************************************************************
 *----------------------------------------------------------------------------*
 *  Remark         : Description                                              *
 *----------------------------------------------------------------------------*
 *  Change History :                                                          *
 *  <Date>     | <Version> | <Author>       | <Description>                   *
 *----------------------------------------------------------------------------*
 *  2022-02-18 | 1.0.0     | GX             | Create file                     *
 *----------------------------------------------------------------------------*
 *  2022-08-18 | 1.0.1     | GX             | fix some bug                    *
 *----------------------------------------------------------------------------*
 *                                                                            *
 ******************************************************************************
 */
#ifndef _TC_STATE_QUEUE_H
#define _TC_STATE_QUEUE_H

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

/*队列的最大容量*/
/*有一个容量用来检测队空队满*/
#define MAXSIZE 10      // 链式队列可以不管，用户也可用这个变量自己做判断

/*队列指针为空*/
#define IS_NULL(que) que == NULL

/*对列是否满（链式队列一般没有满的说法，为了兼容写这个宏函数返回值一定是假*/
#define IS_FULL(que) 	(que->size >= MAXSIZE)

/*队列是否空*/
#define IS_EMPTY(que) (que->front == NULL && que->rear == NULL)

/* 划屏动作 */
typedef enum 
{
	TC_NONE,
	TC_LEFT,
	TC_RIGHT,
	TC_UP,
	TC_DOWN
}TOUCH_SLID;

/* 状态机 */
/* 拖动的判断包含在按下，用户在使用的时候可以根据已定义好的
	结构体变量 touch 成员中的 time_last-time > 0.2 是否
	成立来判断但前的按下是否为长按或者拖动 */
typedef enum
{
	STATE_NOT_PRESSED,			/* 无操作 */
	STATE_PRESSED,					/* 按下 */
	STATE_RELEASE,					/* 释放 */
/* ----------上面是过程态，下面是结果态-------------- */
	STATE_SINGLE_CLICK,			/* 单击 */
	STATE_SLIDE,				  	/* 滑屏 */
	STATE_DTAG							/* 拖动 */
}TOUCH_STATE;

typedef struct TouchState
{
	// bool response;					/* 是否有被响应 */
	int32_t x_per,y_per;		/* 上一轮的坐标，用来判断双击 => 可能没用到 */
	int32_t x_last,y_last;	/* 最后一次的坐标 */
	int32_t x,y;						/* 第一次的坐标 */
	float time_per;					/* 上一轮的时间 => 可能没用到 */
	float time_last;				/* 最后一次的时间 */
	float time;							/* 第一次的时间 => 可能没用到 */
	TOUCH_SLID direction;		/* 划屏方向 */
	TOUCH_STATE	state;			/* 状态机的状态 */
}TouchState_t;

/*数据类型改变时只需改变这里即可*/
/*存储信息的小结构体*/
// typedef struct tcState_ListData
// {
//     TouchState_t data;
// }tcState_ListData_t;

typedef TouchState_t tcState_datatype_t;

typedef struct tcState_node
{
    tcState_datatype_t *data; // 节点数据
    struct tcState_node *next;
}tcState_node_t;

/*链式队列管理结构体*/
typedef struct tcState_linkQueue
{
    int size;       // 队列当前元素个数   
    tcState_node_t *front;    // 循环队列队头元素下标
    tcState_node_t *rear;     // 循环队列队尾元素下标
}tcState_linkQueue_t;

typedef tcState_linkQueue_t tcState_Queue_t;

/*创建队列*/
tcState_Queue_t *tcState_createQueue(void);

/*销毁队列*/
void tcState_destroyQueue(tcState_Queue_t *que);

/*入队*/
bool tcState_inQueue(tcState_Queue_t *que, const void *item);

/*出队*/
bool tcState_outQueue(tcState_Queue_t *que, void *item);

/* 遍历队列内容 */
bool tcState_ergodicQueue(tcState_Queue_t *que);

#endif  /* _TC_STATE_QUEUE_H */
